電腦在讀程式碼是一行一行讀,讀過去的程式碼就過去了,跟逝去的青春一樣(遠目)。
當你有某段程式需要一直重複做~例如需要重複印出"我這個月一定要減肥成功!"(我就是在說沒毅力的我QQ),你可能需要 Ctrl+C/Ctrl+v Cnsole.WriteLine();12次 (或者不只12次...)。
BUT!!!一但這件事情要重複做100萬次,你總不能人生都浪費在複製貼上上面R~~~
於是,需要重複執行程式碼的區塊,就是出動迴圈的時候了!!!!
迴圈有分成四種:
1. for:在程式中遇到要重複同樣動作的指令,就要使用迴圈指令。通常用在執行的次數為已知
。
2. foreach:通常配合陣列使用,指的是執行陣列的每一個物件,陣列有10個就跑10次,執行次數=陣列長度。
3. while:前測試迴圈,通常用在當需要重複執行同樣動作,且執行的次數為未知
時使用。
4. do...while:後測試迴圈,與while相同,但是不管你條件為何,都先執行一次再說。
無論是哪一種迴圈,都可以搭配在switch這篇提到的break、goto、return、throw 或是continue(註)陳述式調整或是結束迴圈
註:continue:將控制權轉移給其所在的封閉式 while、do、for 或 foreach 陳述式的下一個反覆項目。
本篇會先介紹for跟foreach的部分~
先來看看for迴圈的結構
for (initializer初始設定式; condition條件; iterator迭代器)
{
陳述式
}
恩....我翻譯了翻譯白話文↓↓↓↓
for(a.變數起始值;b.迴圈存在條件;c.每圈執行後變數的動作)
{
每一圈要執行的內容
}
運作邏輯:進入迴圈後,從a變數起始值開始跑,檢查是否符合b的條件,每圈結束後執行c的動作
a,b,c間用 ;
分開,讓我們來詳細看一下a,b,c的內容
上述a,b,c不一定要存在,例如for(;;)代表無窮迴圈。for迴圈的層數沒有限制,但越多效率越差。
好,馬上來試寫看看!
題目一: 求N階層,也就是輸入N之後,求1x2x3x...xN。
程式邏輯:
我們先觀察一下,求的結果是從1開始,每次都乘以下一個數,直到要求的數字為止
所以會變成這樣1x(1+1)x((1+1)+1)x(((1+1)+1)+1)....xN
所以我的程式碼:
int answer = 1;
//先給answer一個初始值,由於1乘以任何數都不變,故設定為1
//因為要在for迴圈外讀取answer的結果,所以要宣告在外面
Console.WriteLine("計算1×2×3×…×N,請輸入N=");
int N = Convert.ToInt32(Console.ReadLine());
for (int i = 2; i <= N; i++)
//迴圈從2開始跑,跑到N為止,i每次跑完後+1
//也可以從1開始跑,但是1*1還是1阿沒有必要XD
//不能從0開始跑喔,*0什麼東西都是0了XD
{
answer *= i;
//answer=answer*i;把每一次都乘以i之後賦值給answer
//也就是i=2的時候,執行answer=answer*2。
//於是此時answer=2,i會+1=3
//3如果仍<=N,就再進行一次answer=answer(2)*i(3),直到i不符合<=N的條件為止
}
Console.WriteLine($"answer={answer}");
Console.ReadKey();
好,應該對for有多一點了解了吧?那我們來試著印出99乘法表吧!
題目二:九九乘法表
請印出從2開始的九九乘法表,範例如下圖:
好的,一樣先讓我們來觀察一下九九乘法表 i x j = ixj
i從2開始,乘以j從1~9後,就換下一個數繼續乘。也就是我從2開始到9的每個數我都要分別乘以1~9(重複做)
恩...i要動,j也要動,而且都同一個規律。看來是撰寫巢狀迴圈的時候了!!!!
*巢狀迴圈:for裡面包著for
那讓我們來看一下程式碼
for (int i = 2; i < 10; i++)//i從2開始跑,跑到<10為止(也就是跑到9),i每跑一次就+1
{
for (int j = 1; j < 10; j++)//j從2開始跑,跑到<10為止(也就是跑到9),j每跑一次就+1
{
Console.WriteLine($"{i}x{j}={i*j}");
}
}
Console.ReadKey();
上述程式碼一步一步跟著程式碼跑的話會像以下這樣
看來這個對你來說太簡單了,那我們來小小變化一下
題目三:九九乘法表(變化版)
請輸出如下圖範例
先給個提示:
好!開始囉!
解法一
for (int i = 1; i < 10; i += 3)//從1開始跑,每輪跑完後+3(三組分別是1,4,7開頭)
{
for (int j = 1; j < 10; j++)//每輪從1開始跑,跑9次,這裡是要乘的1~9
{
//以下以每一列為輸出單位
Console.Write($"{i:##} * {j:##} = {i * j:##}\t\t");
//輸出每一列第一段,中間加入間隔\t(同tab鍵)排版,並規定輸出為2個字元空間方便對齊
Console.Write($"{(i + 1):##} * {j:##} = {(i + 1) * j}\t\t");
//輸出每一列第二段,中間加入間隔\t排版,並規定輸出為2個字元空間方便對齊
Console.WriteLine($"{(i + 2):##} * {j:##} = {(i + 2) * j}");
//輸出每一列第三段並換行跑下一個j,並規定輸出為2個字元空間方便對齊
}//#字號為數字預留位置符號,注意不會輸出非有效位數的零
Console.WriteLine();//每完成一個i多換行一次,也就是跑完3,6,9換行(每一組)
}
Console.ReadKey();
\t用法請參考跳脫字元
##用法請參考上一篇String.Format
解法二
for (int i = 1; i < 10; i += 3)//分成上中下三個區塊1,4,7,每個區塊開頭差3
{
for (int j = 1; j < 10; j++)//每區塊會從1-9共跑9次
{
for (int k = i; k < (i + 3); k++)//*前方數字每行從i開始,符合<i+3就跑一圈
{
Console.Write($"{k:##} * {j:##} = {k * j:##}\t");
//每次輸出不換行但用\t隔開,直到k=(i+3)
}
Console.WriteLine();//不符合k<(i+3)後跳出迴圈並換行
}
Console.WriteLine();//跑完每一個區塊後換行,也就是i=3,6,9時
}
Console.ReadKey();
與for用法相同,但不用指定初始值、條件、迭代器。他會將集合中(如陣列)內的所有元素逐一指定給變數,直到每一個元素都處理完畢才離開迴圈。就是元素有幾個就跑幾圈!更詳細的用法會在陣列時說明。
架構如下:
foreach (每一元素 in 陣列)
{
每一圈要執行的內容;
}
有限迴圈就介紹到這啦~
下一篇我們來看看無窮迴圈~
MSDN-continue(C#參考)
MSDN-for(C#參考)
MSDN-foreach、in(C#參考)
有限迴圈和無窮迴圈用 for/foreach/while/do...while 區分上怪怪的,while/do...while 一樣可做有限迴圈,for 也可以做無窮迴圈,真正可歸類有限的只有 foreach (看集合中的物件有多少個)。
恩恩..同意!!!立馬修改!!感謝大大!